手工的歧义性解析

  对一个函数,声明的重载版本过少(或者过多)都有可能导致歧义性。例如,

    void f1(char);
    void f1(long);

    void f2(char*);
    void f2(int*);

    void k(int i)
    {
        f1(i);            // 歧义的:f1(char)或f1(long)
        f2(0);            // 歧义的:f2(char*)或f2(int*)
    }

只要可能,在这种情况下应该做的就是将该函数的重载版本集合作为一个整体来考虑,看看对于函数的语义而言它们是否有意义。有关问题经常可以通过增加一个消除歧义性的版本而得到解决。例如,加进

inline void f1(int n) { f1(long(n)); }

就能以偏向更大类型long int的方式消除所有类型f1(i)的歧义性情况。

  也可以通过增加一个显式类型转换的方式去解决某个特定调用的问题。例如,

f2(static_cast<int*>(0));

然而,这样做经常只是一种权宜之计,很快就可能遇到另一个必须处理的类似调用。

  一些C++新手会被编译器报告出的歧义性错误弄得急躁起来。更有经验的程序员则欣赏这种错误信息,将它们看作是很有用的关于设计错误的指示器。

🔚